// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// 此文件为不为
// 设置SetNonblock和CloseOnExec提供快速路径的平台实现accept。

// go:build aix | darwin | | | | | | | | | | | | | | | | | | | | | | | |，！illumos 

package poll

import (
	"syscall"
)

// 围绕接受系统调用的包装器，该调用将返回的文件
// 描述符标记为非阻塞，并在执行时关闭。
func accept(s int) (int, syscall.Sockaddr, string, error) {
	// 有关ForkLock的说明，请参见../syscall/exec_unix.go。
	// 可能可以在整个系统调用中保持锁。接受
	// 因为我们已将fd.sysfd置于非阻塞模式。
	// 但是，对File方法的调用将使其返回到
	// 阻塞模式。我们不能冒这个险，所以这里不用叉车。
	ns, sa, err := AcceptFunc(s)
	if err == nil {
		syscall.CloseOnExec(ns)
	}
	if err != nil {
		return -1, nil, "accept", err
	}
	if err = syscall.SetNonblock(ns, true); err != nil {
		CloseFunc(ns)
		return -1, nil, "setnonblock", err
	}
	return ns, sa, "", nil
}
